/**
 * 题目：
 * 给定一个只包括 '('，')'，'{'，'}'，'['，']' 的字符串，判断字符串是否有效。
 * 
 * 描述：
 * 1. 左括号必须用相同类型的右括号闭合。
 * 2. 左括号必须以正确的顺序闭合。
 * 3. 注意空字符串可被认为是有效字符串。
 * 
 * 示例：
 * '([]){}' true
 * '{([)]}' false
 */

/**
 * 思路：
 * 遇到左括号'(','[', 通过map[key] 取得右括号')', 放入栈中 [')',']']
 * 如果map[key] 不存在, 则 取除尾部元素']', 
 * 
*/

const isValid = function (str) {
  if (typeof str !== 'string' || str.length % 2 !== 0) {
    return false
  }

  const map = { '{': '}', '[': ']', '(': ')' }
  let stack = []
  
  for (const ch of str) {
    if (ch in map) {
      stack.push(ch)
    } else {
      if (ch !== map[stack.pop()]) return false
    }
  }

  return stack.length === 0
}


// // 测试
// let testStr1 = '([]){}'
// let testStr2 = '{([)]}'
// console.log(isValid(testStr1)) // true
// console.log(isValid(testStr2)) // false
